package com.iot.ic.service;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.iot.ic.common.Config;
import com.iot.ic.common.Response;
import com.iot.ic.common.ReturnCode;
import com.iot.ic.dao.redis.UserRedisDao;
import com.iot.ic.model.UserLogin;
import com.iot.ic.utils.vertify.model.UserToken;

import java.util.Calendar;
import java.util.Date;

@Service
public class UserLoginService {

    @Autowired
    private UserRedisDao userRedisDao;


    /**
     * 认证操作
     * @param accessToken
     * @return
     */
    public Response<UserLogin> authorization(String accessToken) {
        Response<UserLogin> authResult = new Response<UserLogin>();
        if (accessToken != null) {
            UserLogin userLogin = findUserLogin(accessToken);
            if (userLogin == null) {// access_token不存在
                UserToken userToken=userRedisDao.getUserTokenByAccessToken(accessToken);
                if (userToken!=null) {
                    userRedisDao.deleteAccessToken(accessToken);
                    authResult.setInfos(ReturnCode.Err_LongTimeNoLogin);
                    return  authResult;
                }else {
                    authResult.setInfos(ReturnCode.Err_AccessTokenNotExist);
                    return  authResult;
                }
            } else {
                authResult.setResult(userLogin);
                authResult.setDescription("认证成功");
                authResult.setStatus("success");
                authResult.setCode(ReturnCode.No_Err.getCode());
                // 更新最后一次活动时间
                userLogin.setLastActiveTime(new Date(System.currentTimeMillis()));
                saveOrUpdateLoginAccessToken(userLogin);
            }
        } else {
            authResult.setInfos(ReturnCode.Err_AccessTokenNotExist);
        }
        return authResult;
    }

    /**
     * 移除登录信息
     *
     * @param access_token
     * @return
     */
    public boolean removeAccessToken(String access_token) {
        try {
            userRedisDao.deleteLoginCache(access_token);
        } catch (Exception ex) {
            return false;
        }
        return true;
    }

    /**
     * 判断是否token是否过期
     *
     * @param time
     * @return
     */
    public boolean isExpire(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(time.getTime());
        calendar.add(Calendar.DAY_OF_YEAR, Config.maxExpire);
        if (calendar.before(Calendar.getInstance())) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 更新token的有效期
     *
     * @param userLogin
     * @return
     */
    public boolean saveOrUpdateLoginAccessToken(UserLogin userLogin) {
        userRedisDao.addUserLogin(userLogin);
        return true;
    }

    /**
     * 通过accessToken获取用户的主键
     *
     * @param accessToken
     * @return
     */
    public Integer findUserId(String accessToken) {
        UserLogin userLogin = findUserLogin(accessToken);
        return null == userLogin ? null : userLogin.getId();
    }

    /**
     * 查询认证用户
     *
     * @param accessToken
     * @return
     */
    public UserLogin findUserLogin(String accessToken) {
        UserLogin userLogin = null;
        try {
            userLogin = userRedisDao.findLoginUser(accessToken);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return userLogin;
    }

    /**
     * 添加一条认证信息
     * @param userLogin
     */
    public void addUserLogin(UserLogin userLogin){
        userRedisDao.addLoginCache(userLogin);
    }

    /**
     * 删除某用的所有的认证信息
     * @return
     */
    public boolean deleteUserLoginsByUserId(Integer userId){
        return userRedisDao.deleteLoginCacheByUserId(userId);
    }

}
